package com.vallis.lotteryonline.calcutil.lotto.beforecalc;

import cn.hutool.core.math.MathUtil;
import com.vallis.lotteryonline.entity.SingleTickeByStr;

import java.util.Collections;
import java.util.List;

/**
 * @author guozh
 * @Classname AnalyseNum
 * @Description  大乐透分析算法
 * @Date 2020/7/19 23:35
 * @Created by vallis
 */

public interface AnalyseNum {


    //<------------------所需数据生成-------------------------->

    /**
     * 生成大乐透前区所有组合
     * 以备不时之需
     */
    static final  List<String[]> allTicketsFront=allticket(35,5);
    /**
     * 生成大乐透后区所有组合
     * 以备不时之需
     */
    static final List<String[]> allTicketsEnd=allticket(12,2);

    /**
     * 获取前区或后区任意N个号码的组合(即N+0，0+N)
     * @param num
     * @param n
     * @return
     */
    static List<String[]> analyseFrontNum(String[] num,int n) {
        return MathUtil.combinationSelect(num, n);
    }


    //<------------------单票处理-------------------------->


    /**
     * 计算大乐透此票价格(单注、复式)
     * @param ticket
     * @return
     */
    static Long getSinglePrice(SingleTickeByStr ticket){

        long fp = MathUtil.combinationCount(ticket.getFrontNum().length, 5);
        long ep = MathUtil.combinationCount(ticket.getEndNum().length, 2);
        return fp*ep*2;
    }


    /**
     * 适用范围（大乐透，双色球）
     * 在0~M的范围中，生成具有N个数字的所有组合
     * @param m
     * @param n
     * @return
     */
    static List<String[]> allticket(int m,int n){
        String[] arr=new String[m];
        for (int i = 0; i <arr.length ; i++) {
            arr[i]+=1;
        }
        return MathUtil.combinationSelect(arr,n);
    }

    /**
     * sonNmu 的length 需与 List中任意一个String[]的length保持一致
     *  计算sonNum 某个组合在motherNum母组合中出现了多少次
     *  不能适用于controller的计算中
     * @param motherNum
     * @param sonNum
     * @return
     */
    static int getThisNumTimes(List<String[]> motherNum,String[] sonNum){
        return Collections.frequency(motherNum,sonNum);
    }

    //<-------------------奖金计算算法-------------------------->

}
